package com.javaxiaobear.module.system.mapper;

import com.javaxiaobear.base.common.utils.PageUtils;
import com.javaxiaobear.module.system.domain.SysDictData;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import java.util.Arrays;
import java.util.List;

/**
 * 字典表 数据层
 *
 * @author javaxiaobear
 */
public interface SysDictDataMapper extends BaseMapper<SysDictData> {

  /**
   * 根据条件分页查询字典数据
   *
   * @param dictData 字典数据信息
   * @return 字典数据集合信息
   */
  default List<SysDictData> selectDictDataList(SysDictData dictData) {
    QueryWrapper queryWrapper = QueryWrapper.create();

    if (dictData.getDictType() != null && !dictData.getDictType().isEmpty()) {
      queryWrapper.eq(SysDictData::getDictType, dictData.getDictType());
    }

    if (dictData.getDictLabel() != null && !dictData.getDictLabel().isEmpty()) {
      queryWrapper.like(SysDictData::getDictLabel, dictData.getDictLabel());
    }

    if (dictData.getStatus() != null && !dictData.getStatus().isEmpty()) {
      queryWrapper.eq(SysDictData::getStatus, dictData.getStatus());
    }

    queryWrapper.orderBy(SysDictData::getDictSort, true);

    return selectListByQuery(queryWrapper);
  }

  default Page<SysDictData> selectDictDataPage(SysDictData dictData) {
    QueryWrapper queryWrapper = QueryWrapper.create();

    if (dictData.getDictType() != null && !dictData.getDictType().isEmpty()) {
      queryWrapper.eq(SysDictData::getDictType, dictData.getDictType());
    }

    if (dictData.getDictLabel() != null && !dictData.getDictLabel().isEmpty()) {
      queryWrapper.like(SysDictData::getDictLabel, dictData.getDictLabel());
    }

    if (dictData.getStatus() != null && !dictData.getStatus().isEmpty()) {
      queryWrapper.eq(SysDictData::getStatus, dictData.getStatus());
    }

    queryWrapper.orderBy(SysDictData::getDictSort, true);

    return paginate(PageUtils.getPage(), queryWrapper);
  }

  /**
   * 根据字典类型查询字典数据
   *
   * @param dictType 字典类型
   * @return 字典数据集合信息
   */
  default List<SysDictData> selectDictDataByType(String dictType) {
    return QueryChain.of(this)
        .eq(SysDictData::getStatus, "0")
        .eq(SysDictData::getDictType, dictType)
        .orderBy(SysDictData::getDictSort, true)
        .list();
  }

  /**
   * 根据字典类型和字典键值查询字典数据信息
   *
   * @param dictType 字典类型
   * @param dictValue 字典键值
   * @return 字典标签
   */
  default String selectDictLabel(String dictType, String dictValue) {
    return selectOneByQueryAs(
        QueryWrapper.create()
            .select("dict_label")
            .from("sys_dict_data")
            .eq("dict_type", dictType)
            .eq("dict_value", dictValue),
        String.class);
  }

  /**
   * 根据字典数据ID查询信息
   *
   * @param dictCode 字典数据ID
   * @return 字典数据
   */
  default SysDictData selectDictDataById(Long dictCode) {
    return QueryChain.of(this).eq(SysDictData::getDictCode, dictCode).one();
  }

  /**
   * 查询字典数据
   *
   * @param dictType 字典类型
   * @return 字典数据
   */
  default int countDictDataByType(String dictType) {
    return Math.toIntExact(QueryChain.of(this).eq(SysDictData::getDictType, dictType).count());
  }

  /**
   * 通过字典ID删除字典数据信息
   *
   * @param dictCode 字典数据ID
   * @return 结果
   */
  default int deleteDictDataById(Long dictCode) {
    return this.deleteById(dictCode);
  }

  /**
   * 批量删除字典数据信息
   *
   * @param dictCodes 需要删除的字典数据ID
   * @return 结果
   */
  default int deleteDictDataByIds(Long[] dictCodes) {
    return this.deleteBatchByIds(Arrays.asList(dictCodes));
  }

  /**
   * 新增字典数据信息
   *
   * @param dictData 字典数据信息
   * @return 结果
   */
  default int insertDictData(SysDictData dictData) {
    return this.insert(dictData);
  }

  /**
   * 修改字典数据信息
   *
   * @param dictData 字典数据信息
   * @return 结果
   */
  default int updateDictData(SysDictData dictData) {
    return this.update(dictData);
  }

  /**
   * 同步修改字典类型
   *
   * @param oldDictType 旧字典类型
   * @param newDictType 新旧字典类型
   * @return 结果
   */
  default boolean updateDictDataType(String oldDictType, String newDictType) {
    return UpdateChain.of(this)
        .set(SysDictData::getDictType, newDictType)
        .eq(SysDictData::getDictType, oldDictType)
        .update();
  }
}
